package com.powernode.ssm.springAnalysis.a12.def_JDK.d2;

/**
 * 手写JDK实现动态代理二版：
 * 增强逻辑作为参数传入，代理类使用自定义InvocationHandler接口来调用
 * 解决了增强逻辑写死在代理类的问题，存在问题如下：
 *  当目标类存在多个方法时，同时调用多个方法，但出现重复调用同一个方法的bug
 */
public class D2 {

    interface Foo2 {
        void foo() throws Throwable;
        void bar() throws Throwable;
    }

    static class Target implements Foo2 {
        public void foo() {
            System.out.println("target foo");
        }

        @Override
        public void bar() {
            System.out.println("target bar");
        }
    }

    interface InvocationHandler {
        void invoke() throws Throwable;
    }

    public static void main(String[] param) throws Throwable {
        $Proxy2 $Proxy2 = new $Proxy2(()->{
            System.out.println("before");
            new Target().foo();
        });
        $Proxy2.foo();
        $Proxy2.bar();

    }
}